#ifndef BIG_INT
#define BIG_INT
#include <fstream>
#include <vector>
#include <string>
#include <cmath>
#include "fast_vector.h"
struct big_int
{
   public :

      big_int(int = 0);
      big_int(const fast_vector &, bool = false);
      big_int(big_int const &);
      big_int(const std::string &);
      big_int& operator *=(const big_int &);
      big_int& operator *=(long long);
      big_int& operator -=(const big_int &);
      big_int& operator /=(const big_int &);
      big_int& operator %=(const big_int &);
      big_int& operator +=(const big_int &);
      big_int& operator =(const big_int &);
      big_int operator -() const;

      bool operator ==(const big_int &) const;
      bool operator >(const big_int &) const;
      bool operator !=(const big_int &) const;
      bool operator >=(const big_int &) const;
      bool operator <(const big_int &) const;
      bool operator <=(const big_int &) const;
      void swap(big_int &);
      big_int abs() const;

      std::pair<big_int, big_int> divide_with_remainder(const big_int &) const;

      friend std::ostream& operator <<(std::ostream &, const big_int);
      friend std::istream& operator >>(std::istream &, big_int &);
   private :
      
      fast_vector digits_;
      static const int BASE = 1000000000;
      bool is_negative_;

      int find_digit_divisor(const big_int &) const; 
      void cut_zeroes();  
      int compare_to(const big_int &) const;
      big_int& operator <<=(int);
      big_int& operator >>=(size_t);
      bool is_zero() const;

};

big_int operator +(const big_int&, const big_int&);
big_int operator -(const big_int&, const big_int&);
big_int operator %(const big_int&, const big_int&);
big_int operator /(const big_int&, const big_int&);
big_int operator *(const big_int&, const big_int&);
big_int operator ^(const big_int&, const big_int&);
big_int abs(const big_int&);
#endif